package com.hotel.dao.impl;

import com.hotel.dao.MenuDao;
import com.hotel.entity.Menu;
import com.hotel.entity.MenuItem;
import com.hotel.entity.RoleMenu;
import com.hotel.utils.JdbcUtils;

import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author Str
 * @Date 2021/10/29 15:20
 * @Description :
 */
public class MenuDaoImpl implements MenuDao {

    //方法流程:
    //{a}根据 [角色ID] 来获取 [角色菜单]。
    //{b}查询视图文件数据。
    //{c}拼装成一个 List 集合。
    //{d}并返回该对象。
    private List<RoleMenu> getRoleMenus(String roleId)
            throws SQLException {
        //{1}查询 view_role_menu 视图
        String sql = "select * from view_role_menu vr "+
                " where vr.roleid=?";
        //{2}调用 QueryRunner 来查询数据
        List<RoleMenu> list = JdbcUtils.queryList(
                sql, RoleMenu.class, roleId);
        return list;
    }

    private Map<String,Menu> parseList(List<RoleMenu> list){
        Map<String,Menu> menuMap = new HashMap<>();
        //{1}迭代列表, 把里面的数据拆解出来。
        for ( RoleMenu rm : list ) {
            //{2}取得 menuId, 根据 menuId 从 Map 中取出 Menu 对象。
            String menuId = rm.getMenuId();
            Menu menu = menuMap.get(menuId);
            //{3}如果不存在对象, 则创建之(第一次是不存在的)
            if( menu==null ){
                //{4}创建一个新的 Menu(主菜单), 存入 Map
                //   下一次进来直接从 map 中取出 menu
                menu = new Menu( rm );
                menuMap.put( menuId, menu );
                System.out.println( menu );
            }
            //{5} 创建 MenuItem 对象(子菜单)。
            MenuItem mi = new MenuItem( rm );
            //{6} 把 MenuItem (子菜单)加入到 Menu 的 set 中。
            menu.addMenuItem(mi);
            System.out.println( mi );
        }
        return menuMap;
    }

    /* 备注: 提供外部程序 (Service or 其它) 调用。
                     查询指定角色的 Menu (Map);
     */
    @Override
    public Map<String,Menu> getRoleMenuMap( String roleId )
            throws SQLException {
        //{1}从数据库中获取角色菜单数据。
        List<RoleMenu> list = getRoleMenus( roleId );
        //{2}解析列表生成 map
        return parseList( list );
    }

    public static void main(String[] args)
            throws SQLException, IOException {
        MenuDaoImpl menuDao = new MenuDaoImpl();
        menuDao.getRoleMenuMap("*");
    }

}
